package com.yzqp.client_gateway.config;

import com.yzqp.client_gateway.filter.HostAddrKeyResolver;
import com.yzqp.client_gateway.filter.RequestTimeFilter;
import com.yzqp.client_gateway.filter.TokenFilter;
import com.yzqp.client_gateway.filter.UriKeyResolver;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;

/**
 * 网关配置
 */
@Configuration
public class GateWayConfig {

//    @Bean
//    public RouteLocator myRoutes(RouteLocatorBuilder builder) {
//        String httpUri = "http://httpbin.org:80";
//        return builder.routes()
//                /** 上面创建的route可以让请求“/get”请求都转发到“http://httpbin.org/get”。在route配置上，
//                 * 我们添加了一个filter，该filter会将请求添加一个header,key为hello，value为world。
//                */
//                 .route(p -> p
//                        .path("/get")
//                        .filters(f -> f.addRequestHeader("Hello", "World"))
//                        .uri(httpUri))
//                /**
//                 * 在上面的代码中，我们使用了另外一个router，
//                 * 该router使用host去断言请求是否进入该路由，当请求的host有“*.hystrix.com”，都会进入该router，
//                 * 该router中有一个hystrix的filter,该filter可以配置名称、和指向性fallback的逻辑的地址，
//                 * 比如本案例中重定向到了“/fallback”。
//                 *
//                 */
//                .route(p -> p
//                        //.host("*.hystrix.com")
//                        .path("/error")
//                        .filters(f -> f
//                                .hystrix(config -> config
//                                        .setName("mycmd")
//                                        .setFallbackUri("forward:/fallback")))
//                        .uri(httpUri))
//                .build();
//    }

    // 配置 自定义过滤器
    @Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
        // @formatter:off
        return builder.routes()
                .route(r -> r.path("/foo2/**")
                        .filters(f -> f.filter(new RequestTimeFilter())
                                .addResponseHeader("X-Response-Default-Foo", "Default-Bar"))
                        .uri("http://httpbin.org:80/get")
                        .order(0)
                        .id("customer_filter_router")
                )
                .build();
        // @formatter:on
    }


    // 全局过滤器 直接 注入spring容器
    //@Bean
    public TokenFilter tokenFilter(){
        return new TokenFilter();
    }



    // 访问ip限流
    @Bean
    public HostAddrKeyResolver hostAddrKeyResolver() {
        return new HostAddrKeyResolver();
    }

    // url限流
    @Bean
    public UriKeyResolver uriKeyResolver() {
        return new UriKeyResolver();
    }

    // 用户维度限流
    @Bean
    KeyResolver userKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
    }

}
